class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        // 把所有的0改为-1 ===> 转化为求最长和为0的子数组的长度
        // for(auto &e :nums)
        //     if(e == 0)
        //         e = -1;

        // <前缀和，下标>
        unordered_map<int, int> hash;

        // 初始化
        hash[0] = -1;

        int ans = 0, sum = 0, n = nums.size();
        for(int i = 0; i < n; i++)
        {
            // 把所有的0改为-1(放在这修改也可以，而且不用遍历原数组，很妙!)
            sum += nums[i] == 0 ? -1 : 1;

            if(hash.count(sum))
                ans = max(ans, i - hash[sum]);
            else
                hash[sum] = i;
            // 如果出现重复的<sum, i> 保留之前那一对
            // if(!hash.count(sum))
            //     hash.insert(make_pair(sum, i));
        }

        return ans;
    }
};